package cn.yusei.teamTribe.service.file;

import java.io.InputStream;

import org.springframework.stereotype.Service;

import cn.yusei.teamTribe.constant.Modules;
import cn.yusei.teamTribe.exception.FileNotExistsException;
import cn.yusei.teamTribe.exception.ModuleNotExistsException;
import cn.yusei.teamTribe.exception.ReadFileException;
import cn.yusei.teamTribe.exception.ReadInputStreamException;
import cn.yusei.teamTribe.exception.WriteByteException;
import cn.yusei.teamTribe.util.EncryptionUtil;
import cn.yusei.teamTribe.util.FileByteUtil;
import cn.yusei.teamTribe.util.PathUtil;
import cn.yusei.teamTribe.util.SaltUtil;

@Service
public class FileService {

	/**
	 * 文件系统分隔符
	 */
	private final char SEPARATOR_CHAR = '/';
	
	/**
	 * 
	 * @return     返回路径如下： {jar包所在目录}/{mod名}/文件名
	 */
	private String getPublicPath(String mod, String fileName)
	{
		return new StringBuffer()
				.append(PathUtil.RUNNING_PATH)
				.append(SEPARATOR_CHAR)
				.append(mod)
				.append(SEPARATOR_CHAR)
				.append(fileName)
				.toString();
	}
	
	/**
	 * @return     返回路径如下： {jar包所在目录}/{mod名}/{用户的id}/文件名
	 */
	private String getPrivatePath(String mod, int id, String fileName)
	{
		return new StringBuffer()
		.append(PathUtil.RUNNING_PATH)
		.append(SEPARATOR_CHAR)
		.append(mod)                                     //必须先 mod 后 id
		.append(SEPARATOR_CHAR)
		.append(id)
		.append(SEPARATOR_CHAR)
		.append(fileName)
		.toString();
	}
	
	/**
	 * 保存用户上传的文件
	 * 根据抛出的异常判断结果
	 * 
	 * @param id  上传者的 id
	 * @param modId  模块，取值定义在{@link Modules}
	 * @param in
	 * @param isPublic 是否不分用户保存
	 * @return   保存的文件名
	 */
	public String putFile(int modId, int id, InputStream in, boolean isPublic)
			throws ReadInputStreamException, WriteByteException
	{
		String mod = Modules.getModuleName(modId);
		String fileName = EncryptionUtil.getEncryptedString(mod + id + SaltUtil.getSalt());
		FileByteUtil.inputStreamToFile(isPublic ? getPublicPath(mod, fileName) : getPrivatePath(mod, id, fileName), in);
		return fileName;
	}
	
	/**
	 * 获取一个文件
	 *
	 * @param mod
	 * @param id 需要访问权限的文件的拥有者的 id， 如果 id 为 0， 表示文件不需要访问权限，如头像
	 * @return   文件 byte 数组
	 */
	public byte[] getFile(int modId, int id, String fileName)
			throws ModuleNotExistsException, FileNotExistsException, ReadFileException
	{
		String mod = Modules.getModuleName(modId);
		return FileByteUtil.fileToByte((id == 0) ? getPublicPath(mod, fileName) : getPrivatePath(mod, id, fileName));
	}
}
